#include <mips/regdef.h>


#define FTI_LINE_NUMBER  84
#define FTI_LAST_POS   80	 
#define FTI_START_INDEX  76	 
#define FTI_TEXT	72 

#define FTI_SSIZE   72 	 

#define FTI_RA 	64	 
#define FTI_FP	60	 
#define FTI_GP	56	 

#define FTI_RESULT	 48
#define FTI_TOTAL_LENGTH  44
#define FTI_TAG_NAME	 40
#define FTI_TAG_START_POSITION   36	
#define FTI_TEXT_LENGTH	 32
#define FTI_FOUND  28
#define FTI_CURRENT_POS  24

	.text
	.align	2
	.globl	findTagInner
	.ent	findTagInner
findTagInner:
	.frame	$fp,FTI_SSIZE,ra		
	.mask	0xd0000000,-8
	.fmask	0x00000000,0
	.set	noreorder
	.cpload	t9
	.set	reorder
	subu	sp,sp,FTI_SSIZE              #Crear stack
	.cprestore 16
	sw	ra,FTI_RA(sp)                    #Guardo registros del SRA
	sw	$fp,FTI_FP(sp)
	sw	gp,FTI_GP(sp)
	move	$fp,sp
	sw	a0,FTI_TEXT($fp)                 #Guardar argumentos en ABA del caller
	sw	a1,FTI_START_INDEX($fp)
	sw	a2,FTI_LAST_POS($fp)
	sw	a3,FTI_LINE_NUMBER($fp)
	lw	v0,FTI_START_INDEX($fp)
	sw	v0,FTI_CURRENT_POS($fp)
	sw	zero,FTI_FOUND($fp)
	lw	a0,FTI_TEXT($fp)
	la	t9,strlen
	jal	ra,t9
	sw	v0,FTI_TEXT_LENGTH($fp)
	li	v0,-1			
	sw	v0,FTI_TAG_START_POSITION($fp)
LOOP:
	lw	v0,FTI_CURRENT_POS($fp)          #Verifico condicion de while
	lw	v1,FTI_TEXT_LENGTH($fp)
	slt	v0,v0,v1
	beq	v0,zero,ENDLOOP
	lw	v0,FTI_FOUND($fp)
	bne	v0,zero,ENDLOOP
	lw	v1,FTI_TEXT($fp)                 #Obtengo puntero a la posicion inicial del texto
	lw	v0,FTI_CURRENT_POS($fp)
	addu	v0,v1,v0
	lb	v1,0(v0)
	li	v0,60			                 #Comparo contra el caracter '<'	
	bne	v1,v0,CHECKEOL
	lw	v0,FTI_CURRENT_POS($fp)
	sw	v0,FTI_TAG_START_POSITION($fp)   #Si son iguales asigno current pos a tag start pos
CHECKEOL:
	lw	v1,FTI_TEXT($fp)
	lw	v0,FTI_CURRENT_POS($fp)
	addu	v0,v1,v0
	lb	v1,0(v0)
	li	v0,10			                 #Salto de linea '\n'
	bne	v1,v0,CHECKENDOFTAG
	lw	v1,FTI_LINE_NUMBER($fp)
	lw	v0,FTI_LINE_NUMBER($fp)
	lw	v0,0(v0)
	addu	v0,v0,1
	sw	v0,0(v1)
CHECKENDOFTAG:
	lw	v1,FTI_TEXT($fp)
	lw	v0,FTI_CURRENT_POS($fp)
	addu	v0,v1,v0
	lb	v1,0(v0)
	li	v0,62			                 #Caracter '>'
	bne	v1,v0,NEXT                       #Si no es igual paso al siguiente caracter
	lw	v1,FTI_CURRENT_POS($fp)
	lw	v0,FTI_TAG_START_POSITION($fp)
	subu	v0,v1,v0
	addu	v0,v0,1
	sw	v0,FTI_TOTAL_LENGTH($fp)         #Calculo el total length del tag
	li	v0,1			
	sw	v0,FTI_FOUND($fp)                #Seteo found en 1
	lw	v0,FTI_TOTAL_LENGTH($fp)
	addu	v0,v0,1
	move	a0,v0
	la	t9,malloc                        #Aloco memoria para la copia del tag
	jal	ra,t9
	sw	v0,FTI_TAG_NAME($fp)
	lw	v1,FTI_TEXT($fp)                 #Inicializo los parametros de strncpy
	lw	v0,FTI_TAG_START_POSITION($fp)
	addu	v0,v1,v0
	lw	a0,FTI_TAG_NAME($fp)             #a0: Puntero al tagName
	move	a1,v0                        #a1: Puntero a la posicion del text
	lw	a2,FTI_TOTAL_LENGTH($fp)         #a2: Cantidad de caracteres a copiar
	la	t9,strncpy
	jal	ra,t9
	lw	v1,FTI_TAG_NAME($fp)
	lw	v0,FTI_TOTAL_LENGTH($fp)
	addu	v0,v1,v0
	sb	zero,0(v0)                       #Guarda el caracter de fin de string '\0'
NEXT:
	lw	v0,FTI_CURRENT_POS($fp)
	addu	v0,v0,1
	sw	v0,FTI_CURRENT_POS($fp)
	b	LOOP
ENDLOOP:
	lw	v1,FTI_FOUND($fp)
	li	v0,1			# 0x1
	bne	v1,v0,NOTFOUND
	lw	v0,FTI_LAST_POS($fp)
	lw	v1,FTI_CURRENT_POS($fp)
	sw	v1,0(v0)
	lw	v0,FTI_TAG_NAME($fp)
	sw	v0,FTI_RESULT($fp)
	b	END
NOTFOUND:
	sw	zero,FTI_LAST_POS($fp)
	sw	zero,FTI_RESULT($fp)
END:
	lw	v0,FTI_RESULT($fp)               #Cargo el resultado para devolverlo
	move	sp,$fp                       #Vuelvo a cargar los registros del micro
	lw	ra,FTI_RA(sp)
	lw	$fp,FTI_FP(sp)
	addu	sp,sp,FTI_SSIZE              #Destruyo stack
	j	ra                               #Vuelvo
	.end	findTagInner
